package com.example.utils;

import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * @Author: 张比特
 * @Data: 2024/12/13 下午9:21
 * @Version: v1.0.0
 * @Description: TODO 临时文件管理工具
 **/
public class TempFileUtil {

//    private static final String TEMP_DIR_SYSTEM_PROPERTY = "user.dir"; 存放在当前允许路径下，存放的文件信息不完整

    // 系统临时目录
    private static final String TEMP_DIR_SYSTEM_PROPERTY = "java.io.tmpdir";
    private static final Path TEMP_DIR = Paths.get(System.getProperty(TEMP_DIR_SYSTEM_PROPERTY));

    // 私有构造方法，避免实例化
    private TempFileUtil() {
        throw new UnsupportedOperationException("拒绝实例化");
    }

    /**
     * 创建一个临时文件，用于存放.nii，并返回其路径。
     *
     * @param prefix 文件名前缀
     * @param suffix 文件名后缀
     * @return 临时文件的路径
     * @throws IOException 如果文件创建失败
     */
    public static Path createTempFile(String prefix, String suffix) throws IOException {
        // 文件前缀，文件后缀，文件创建后存在哪个路径中
        File tempFile = File.createTempFile(prefix, suffix, createTempDir("nii").toFile());
        return tempFile.toPath();
    }

    /**
     * 创建一个临时目录，用于存放PNG，并返回其路径。
     * 存放NII的临时路径，给runfdfeatures方法识别
     *
     * @param prefix 目录名前缀
     * @return 临时目录的路径
     * @throws IOException 如果目录创建失败
     */
    public static Path createTempDir(String prefix) throws IOException {
        String tempDirName = prefix + "-" + UUID.randomUUID();
        Path tempDir = TEMP_DIR.resolve(tempDirName);
        Files.createDirectory(tempDir);
        return tempDir;
    }

    /**
     * 删除指定的临时文件或目录。
     *
     * @param tempPath 要删除的临时文件或目录的路径
     * @throws IOException 如果删除失败
     */
    public static void deleteTempPath(Path tempPath) throws IOException {
        // 检查路径是否存在
        if (Files.exists(tempPath)) {
            // 检查是否为目录
            if (Files.isDirectory(tempPath)) {
                try (DirectoryStream<Path> stream = Files.newDirectoryStream(tempPath)) {
                    for (Path entry : stream) {
                        deleteTempPath(entry); // 递归删除子目录和文件
                    }
                }
            }
            // 无论是文件还是空目录，都可以删除
            Files.delete(tempPath);
        }
    }

}
